package com.hongji.service;

import com.hongji.model.RawBidInfo;
import lombok.extern.slf4j.Slf4j;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.Security;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Properties;

@Slf4j
public class EmailService {

    // 邮件服务器配置
    private final String host;
    private final int port;
    private final String username;
    private final String password;
    private final String fromAddress;
    private final String toAddresses;

    // 邮件主题模板
    private static final String EMAIL_SUBJECT = "昨日招标信息汇总 - %s";

    /**
     * 邮件服务构造函数
     * @param host SMTP服务器地址
     * @param port SMTP端口
     * @param username 发件邮箱用户名
     * @param password 发件邮箱密码
     * @param fromAddress 发件人地址（格式：名称 <email@example.com>）
     * @param toAddresses 收件人地址（多个用逗号分隔）
     */
    public EmailService(String host, int port, String username, String password,
                        String fromAddress, String toAddresses) {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
        this.fromAddress = fromAddress;
        this.toAddresses = toAddresses;
    }

    /**
     * 发送招标信息邮件
     * @param bidInfoLists 招标信息列表的列表（包含 "起重机相关" 和 "变频器相关" 两个列表）
     * @param reportDate 报告日期（通常是昨天）
     */
    public void sendBidInfoEmail(List<List<RawBidInfo>> bidInfoLists, LocalDate reportDate) {
        if (bidInfoLists == null || bidInfoLists.isEmpty()) {
            log.info("[邮件服务] 没有需要发送的招标信息，跳过邮件发送");
            return;
        }

        log.info("[邮件服务] 开始准备招标信息邮件...");

        // 设置Java安全协议
        setJavaSecurityProtocols();

        // 尝试多个端口
        int[] portsToTry = {465, 994, 587, 25};
        boolean sentSuccessfully = false;

        for (int currentPort : portsToTry) {
            try {
                log.info("[邮件服务] 尝试使用端口: {}", currentPort);
                sendWithPort(currentPort, bidInfoLists, reportDate);
                log.info("[邮件服务] 招标信息邮件发送成功！(使用端口 {})", currentPort);
                log.info("主题: {}", String.format(EMAIL_SUBJECT, reportDate.format(DateTimeFormatter.ISO_DATE)));
                log.info("收件人: {}", toAddresses);
                log.info("包含记录数: {}", bidInfoLists.stream().mapToInt(List::size).sum());
                sentSuccessfully = true;
                break; // 发送成功则跳出循环
            } catch (MessagingException e) {
                log.error("[邮件服务] 端口 {} 发送失败: {}", currentPort, e.getMessage());
                // 继续尝试下一个端口
            }
        }

        if (!sentSuccessfully) {
            log.error("[邮件服务] 所有端口尝试失败，无法发送邮件");
        }
    }

    /**
     * 使用指定端口发送邮件
     */
    private void sendWithPort(int port, List<List<RawBidInfo>> bidInfoLists, LocalDate reportDate) throws MessagingException {
        // 创建邮件会话属性
        Properties props = getProperties(port);

        // 创建会话
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        // 启用详细调试日志
        session.setDebug(true);

        // 创建邮件
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(fromAddress));

        // 设置收件人（支持多个）
        String[] recipients = toAddresses.split("\\s*,\\s*");
        InternetAddress[] addresses = new InternetAddress[recipients.length];
        for (int i = 0; i < recipients.length; i++) {
            addresses[i] = new InternetAddress(recipients[i]);
        }
        message.setRecipients(Message.RecipientType.TO, addresses);

        // 设置邮件主题
        String subject = String.format(EMAIL_SUBJECT, reportDate.format(DateTimeFormatter.ISO_DATE));
        message.setSubject(subject);

        // 创建邮件正文（HTML格式）
        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setContent(generateEmailContent(bidInfoLists, reportDate), "text/html; charset=utf-8");

        // 创建多部分消息
        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(bodyPart);

        // 设置邮件内容
        message.setContent(multipart);

        // 发送邮件
        Transport.send(message);
    }

    private Properties getProperties(int port) {
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.connectiontimeout", 15000); // 15秒连接超时
        props.put("mail.smtp.timeout", 30000);           // 30秒IO超时

        // 163邮箱特殊配置
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.put("mail.smtp.ssl.trust", "smtp.163.com"); // 信任163证书

        // 启用TLS（如果使用587端口）
        if (port == 587) {
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.starttls.required", "true");
        }
        return props;
    }

    /**
     * 设置Java安全协议（解决TLS连接问题）
     */
    private void setJavaSecurityProtocols() {
        // 修复SSL安全策略问题
        System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
        System.setProperty("https.protocols", "TLSv1.2");

        // 移除有问题的算法限制
        String disabledAlgorithms = Security.getProperty("jdk.tls.disabledAlgorithms");
        if (disabledAlgorithms != null && disabledAlgorithms.contains("TLSv1, TLSv1.1")) {
            Security.setProperty("jdk.tls.disabledAlgorithms", disabledAlgorithms
                    .replace("TLSv1, TLSv1.1", "")
                    .replace(", ,", ",")
                    .trim());
        }
    }

    /**
     * 生成HTML格式的邮件内容
     * @param bidInfoLists 招标信息的列表（包含 "起重机相关" 和 "变频器相关"）
     * @param reportDate 报告日期
     * @return HTML格式的邮件内容
     */
    private String generateEmailContent(List<List<RawBidInfo>> bidInfoLists, LocalDate reportDate) {
        StringBuilder html = new StringBuilder();

        // HTML头部
        html.append("<!DOCTYPE html>")
                .append("<html lang=\"zh-CN\">")
                .append("<head>")
                .append("<meta charset=\"UTF-8\">")
                .append("<title>招标信息汇总</title>")
                .append("<style>")
                .append("  body { font-family: 'Microsoft YaHei', Arial, sans-serif; line-height: 1.6; color: #333; }")
                .append("  .container { max-width: 900px; margin: 0 auto; padding: 20px; }")
                .append("  .header { background-color: #f8f9fa; padding: 15px; border-radius: 5px; margin-bottom: 20px; }")
                .append("  .header h1 { color: #1a56db; margin: 0; }")
                .append("  .summary { background-color: #e8f4fd; padding: 15px; border-radius: 5px; margin-bottom: 20px; }")
                .append("  .summary p { margin: 5px 0; }")
                .append("  .info-count { font-size: 1.2em; font-weight: bold; color: #1a56db; }")
                .append("  .bid-table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }")
                .append("  .bid-table th, .bid-table td { border: 1px solid #ddd; padding: 12px; text-align: left; }")
                .append("  .bid-table th { background-color: #1a56db; color: white; }")
                .append("  .bid-table tr:nth-child(even) { background-color: #f8f9fa; }")
                .append("  .bid-table tr:hover { background-color: #e8f4fd; }")
                .append("  .bid-link { color: #1a56db; text-decoration: none; }")
                .append("  .bid-link:hover { text-decoration: underline; }")
                .append("  .footer { margin-top: 30px; color: #6b7280; font-size: 0.9em; text-align: center; }")
                .append("</style>")
                .append("</head>")
                .append("<body>")
                .append("<div class=\"container\">");

        // 邮件头部
        html.append("<div class=\"header\">")
                .append("<h1>招标信息监控系统</h1>")
                .append("</div>");

        // 摘要信息
        html.append("<div class=\"summary\">")
                .append("<p>您好，以下是系统监控到的昨日招标信息汇总：</p>")
                .append("<p>监控日期: <strong>").append(reportDate.format(DateTimeFormatter.ISO_DATE)).append("</strong></p>")
                .append("<p>有效信息数量: <span class=\"info-count\">")
                .append(bidInfoLists.stream().mapToInt(List::size).sum()).append("</span> 条</p>")
                .append("</div>");

        // 招标信息：起重机相关
        html.append("<h2>起重机相关</h2>");
        appendBidInfoTable(html, bidInfoLists.get(0));

        // 招标信息：变频器相关
        html.append("<h2>变频器相关</h2>");
        appendBidInfoTable(html, bidInfoLists.get(1));

        // 邮件页脚
        html.append("<div class=\"footer\">")
                .append("<p>此邮件由招标信息监控系统自动发送，请勿直接回复</p>")
                .append("<p>系统监控时间: ").append(LocalDate.now().format(DateTimeFormatter.ISO_DATE)).append("</p>")
                .append("<p>如需调整监控设置，请联系系统管理员</p>")
                .append("</div>");

        // 结束
        html.append("</div></body></html>");

        return html.toString();
    }

    private void appendBidInfoTable(StringBuilder html, List<RawBidInfo> bidInfos) {
        if (!bidInfos.isEmpty()) {
            html.append("<table class=\"bid-table\">")
                    .append("<thead><tr>")
                    .append("<th style=\"width: 5%;\">序号</th>")
                    .append("<th style=\"width: 50%;\">标题</th>")
                    .append("<th style=\"width: 15%;\">发布日期</th>")
                    .append("<th style=\"width: 30%;\">操作</th>")
                    .append("</tr></thead>")
                    .append("<tbody>");

            for (int i = 0; i < bidInfos.size(); i++) {
                RawBidInfo info = bidInfos.get(i);
                html.append("<tr>")
                        .append("<td>").append(i + 1).append("</td>")
                        .append("<td>").append(info.getTitle()).append("</td>")
                        .append("<td>").append(info.getRawPublishText()).append("</td>")
                        .append("<td><a href=\"").append(info.getUrl()).append("\" class=\"bid-link\" target=\"_blank\">查看详情</a></td>")
                        .append("</tr>");
            }

            html.append("</tbody></table>");
        } else {
            html.append("<div class=\"no-data\">")
                    .append("<p>未发现符合条件的招标信息</p>")
                    .append("</div>");
        }
    }
}
